﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Stl.Controls
{
    /// <summary>
    /// Control de test pour ComboBoxIndex.
    /// </summary>
    public partial class ClusterIndex : UserControl
    {
        /// <summary>
        /// Mode verbose: demande de confirmation, de validation, et d'annulation.
        /// </summary>
        public bool Verbose { get; set; }

        /// <summary>
        /// Constructeur.
        /// </summary>
        public ClusterIndex()
        {
            InitializeComponent();
            InitListStyleComboBox();
            InitLimitTextBox();
        }

        /// <summary>
        /// Ajout d'items dans listStyleComboBox.
        /// </summary>
        private void InitListStyleComboBox()
        {
            Type type = comboBoxIndex.ListStyle.GetType();
            string[] names = Enum.GetNames(type);
            foreach (string str in names)
            {
                listStyleComboBox.Items.Add(str);
                sortedListStyleComboBox.Items.Add(str);
            }
            listStyleComboBox.SelectedIndex = 0;
            sortedListStyleComboBox.SelectedIndex = 0;
        }

        /// <summary>
        /// Initialisation du texte correspodant à la limite par defaut.
        /// </summary>
        private void InitLimitTextBox()
        {
            limitTextBox.Text = comboBoxIndex.ListLimit.ToString();
            sortedLimitTextBox.Text = sortedComboBoxIndex.ListLimit.ToString();
        }

        /// <summary>
        /// Ajout d'un texte à la liste des traces.
        /// </summary>
        /// <param name="str"></param>
        private void AddText(string str)
        {
            listBox.Items.Add(str);
            listBox.SelectedIndex = listBox.Items.Count - 1;
        }

        /// <summary>
        /// Récupère le contrôle actif.
        /// </summary>
        /// <returns></returns>
        private string GetActiveControlName()
        {
            return ActiveControl.Name;
        }

        /// <summary>
        /// Récupère le statut de ListStyle sous forme de texte.
        /// </summary>
        /// <param name="ls"></param>
        /// <returns></returns>
        private string ListStyleToString(ComboBoxIndex.ListStyles ls)
        {
            switch (ls)
            {
                case ComboBoxIndex.ListStyles.None: return "None";
                case ComboBoxIndex.ListStyles.AutoInsert: return "AutoInsert";
                case ComboBoxIndex.ListStyles.AutoLimit: return "AutoLimit";
                case ComboBoxIndex.ListStyles.All: return "All";
                default: return "Error";
            }
        }

        /// <summary>
        /// Evènement déclenché lors du changement de statut de la CheckBox "validate".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void validateCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            comboBoxIndex.TextValidate = validateCheckBox.Checked;
            sortedComboBoxIndex.TextValidate = validateCheckBox.Checked;
            AddText("TextValide = " + validateCheckBox.Checked);
        }

        /// <summary>
        /// Evènement déclenché lors du changement de statut de la CheckBox "cancel".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cancelCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            comboBoxIndex.TextCancel = cancelCheckBox.Checked;
            sortedComboBoxIndex.TextCancel = cancelCheckBox.Checked;
            AddText("TextCancel = " + cancelCheckBox.Checked);
        }

        /// <summary>
        /// Evènement déclenché lors du changement de statut de la CheckBox "verbose".
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void verboseCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            Verbose = verboseCheckBox.Checked;
            AddText("Mode verbose = " + Verbose);
        }

        /// <summary>
        /// Evénement associé au clic du bouton "Set limite"de la liste non triée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void limitButton_Click(object sender, EventArgs e)
        {
            int limit;
            try
            {
                limit = int.Parse(limitTextBox.Text);
                if (limit < 0)
                    throw new Exception("La limit doit être un nombre positif.");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            comboBoxIndex.ListLimit = limit;
            AddText("comboBoxIndex\t\tListLimit = " + limit);
        }

        /// <summary>
        /// Evénement associé au clic du bouton "Set limite" de la liste triée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sortedLimitButton_Click(object sender, EventArgs e)
        {
            int limit;
            try
            {
                limit = int.Parse(sortedLimitTextBox.Text);
                if (limit < 0)
                    throw new Exception("La limit doit être un nombre positif.");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            sortedComboBoxIndex.ListLimit = limit;
            AddText("sortedComboBoxIndex\tListLimit = " + limit);
        }

        /// <summary>
        /// Evènement déclenché lors de la validation.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxIndex_TextValidating(object sender, TextValidatingEventArgs e)
        {
            AddText(GetActiveControlName() + "\tEvent\tTextValidating");
            if (Verbose &&
                DialogResult.No == MessageBox.Show("Vous voulez valider le text?", "", MessageBoxButtons.YesNo))
                e.Cancel = true;
        }

        /// <summary>
        /// Evènement déclenché après la validation.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxIndex_TextValidated(object sender, EventArgs e)
        {
            AddText(GetActiveControlName() + "\tEvent\tTextValidated");
        }

        /// <summary>
        /// Evènement déclenché lors de l'annulation.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxIndex_TextCancelling(object sender, CancelEventArgs e)
        {
            AddText(GetActiveControlName() + "\tEvent\tTextCancelling");
            if (Verbose &&
                DialogResult.No == MessageBox.Show("Vous voulez restaurer le text?", "", MessageBoxButtons.YesNo))
                e.Cancel = true;
        }

        /// <summary>
        /// Evènement déclenché après l'annulation.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxIndex_TextCancelled(object sender, EventArgs e)
        {
            AddText(GetActiveControlName() + "\tEvent\tTextCancelled");
        }

        /// <summary>
        /// Evènement déclenché lors du changement de la sélection pour la liste de styloe associée
        /// à la ComboBoxIndex non triée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void listStyleComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            comboBoxIndex.ListStyle = (ComboBoxIndex.ListStyles)listStyleComboBox.SelectedIndex;
            UpdateCheckBox();
        }

        /// <summary>
        /// Evènement déclenché lors du changement de la sélection pour la liste de styloe associée
        /// à la ComboBoxIndex triée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sortedListStyleComboBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            sortedComboBoxIndex.ListStyle = (ComboBoxIndex.ListStyles)sortedListStyleComboBox.SelectedIndex;
            UpdateSortedCheckBox();
        }

        /// <summary>
        /// Evènement lié au status auto-insert de la ComboBoxIndex non triée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void autoInsertCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            comboBoxIndex.AutoInsert = autoInsertCheckBox.Checked;
            UpdateListStyleComboBox();
        }

        /// <summary>
        /// Evènement lié au status auto-limitt de la ComboBoxIndex non triée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void autoLimitheckBox_CheckedChanged(object sender, EventArgs e)
        {
            comboBoxIndex.AutoLimit = autoLimitheckBox.Checked;
            UpdateListStyleComboBox();
        }

        /// <summary>
        /// Evènement lié au status auto-insert de la ComboBoxIndex triée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sortedAutoInsertheckBox_CheckedChanged(object sender, EventArgs e)
        {
            sortedComboBoxIndex.AutoInsert = sortedAutoInsertCheckBox.Checked;
            UpdateSortedListStyleComboBox();
        }

        /// <summary>
        /// Evènement lié au status auto-limit de la ComboBoxIndex triée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sortedAutoLimitCheckBox_CheckedChanged(object sender, EventArgs e)
        {
            sortedComboBoxIndex.AutoLimit = sortedAutoLimitCheckBox.Checked;
            UpdateSortedListStyleComboBox();
        }

        /// <summary>
        /// Evènement liée au changement de propriété de la liste de styles de la
        /// ComboBoxIndex non triée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void comboBoxIndex_ListStyleChanged(object sender, EventArgs e)
        {
            AddText("comboBoxIndex\t\tListStyle\t" + ListStyleToString(comboBoxIndex.ListStyle));
        }

        /// <summary>
        /// Evènement liée au changement de propriété de la liste de styles de la
        /// ComboBoxIndex triée.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void sortedComboBoxIndex_ListStyleChanged(object sender, EventArgs e)
        {
            AddText("sortedComboBoxIndex\tListStyle\t" + ListStyleToString(sortedComboBoxIndex.ListStyle));
        }

        /// <summary>
        /// Fonction de mise à jour de la ComboBoxIndex non triée.
        /// </summary>
        private void UpdateCheckBox()
        {
            autoInsertCheckBox.Checked = comboBoxIndex.AutoInsert;
            autoLimitheckBox.Checked = comboBoxIndex.AutoLimit;
        }

        /// <summary>
        /// Fonction de mise à jour de la ComboBoxIndex triée.
        /// </summary>
        private void UpdateSortedCheckBox()
        {
            sortedAutoInsertCheckBox.Checked = sortedComboBoxIndex.AutoInsert;
            sortedAutoLimitCheckBox.Checked = sortedComboBoxIndex.AutoLimit;
        }

        /// <summary>
        /// Mise à jour de la liste de styles de la ComboiBoxIndex non triée.
        /// </summary>
        private void UpdateListStyleComboBox()
        {
            listStyleComboBox.SelectedIndex = (int)comboBoxIndex.ListStyle;
        }

        /// <summary>
        /// Mise à jour de la liste de styles de la ComboiBoxIndex triée.
        /// </summary>
        private void UpdateSortedListStyleComboBox()
        {
            sortedListStyleComboBox.SelectedIndex = (int)sortedComboBoxIndex.ListStyle;
        }
    }
}
